xen: add helpers for PDX mask initialisation calculations
authorIan Campbell <ian.campbell@citrix.com>
Tue, 16 Sep 2014 20:01:41 +0000 (21:01 +0100)
committerIan Campbell <ian.campbell@citrix.com>
Mon, 22 Sep 2014 16:02:30 +0000 (17:02 +0100)
I wanted to make fill_mask a public function so I could use it on ARM, but it
was actually easier to think of a (semi) reasonable public name for the users
of it, so that is what I have done.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Julien Grall <julien.grall@linaro.org>
xen/arch/x86/srat.c
xen/common/pdx.c
xen/include/xen/pdx.h

index 2b052721c46a5534da7996b98d7ccf939e5ccad8..29fc72438c2318996edd1bd6396c0d3861ca99ce 100644 (file)
@@ -339,13 +339,6 @@ void __init acpi_numa_arch_fixup(void) {}
 
 static u64 __initdata srat_region_mask;
 
-static u64 __init fill_mask(u64 mask)
-{
-       while (mask & (mask + 1))
-               mask |= mask + 1;
-       return mask;
-}
-
 static int __init srat_parse_region(struct acpi_subtable_header *header,
                                    const unsigned long end)
 {
@@ -366,8 +359,7 @@ static int __init srat_parse_region(struct acpi_subtable_header *header,
                       ma->base_address, ma->base_address + ma->length - 1);
 
        srat_region_mask |= ma->base_address |
-                           fill_mask(ma->base_address ^
-                                     (ma->base_address + ma->length - 1));
+                           pdx_region_mask(ma->base_address, ma->length);
 
        return 0;
 }
@@ -381,7 +373,7 @@ void __init srat_parse_regions(u64 addr)
            acpi_table_parse(ACPI_SIG_SRAT, acpi_parse_srat))
                return;
 
-       srat_region_mask = fill_mask(addr - 1);
+       srat_region_mask = pdx_init_mask(addr);
        acpi_table_parse_srat(ACPI_SRAT_TYPE_MEMORY_AFFINITY,
                              srat_parse_region, 0);
 
@@ -389,9 +381,7 @@ void __init srat_parse_regions(u64 addr)
                if (e820.map[i].type != E820_RAM)
                        continue;
 
-               if (~mask &
-                   fill_mask(e820.map[i].addr ^
-                             (e820.map[i].addr + e820.map[i].size - 1)))
+               if (~mask & pdx_region_mask(e820.map[i].addr, e820.map[i].size))
                        mask = 0;
        }
 
index 11349a7e392e4444a2e2478813d29c2657288874..cf8b9b577e85df9332be2132e7c5a968ca30c555 100644 (file)
@@ -41,6 +41,24 @@ int __mfn_valid(unsigned long mfn)
                            pdx_group_valid));
 }
 
+/* Sets all bits from the most-significant 1-bit down to the LSB */
+static u64 __init fill_mask(u64 mask)
+{
+        while (mask & (mask + 1))
+                mask |= mask + 1;
+        return mask;
+}
+
+u64 __init pdx_init_mask(u64 base_addr)
+{
+       return fill_mask(base_addr - 1);
+}
+
+u64 __init pdx_region_mask(u64 base, u64 len)
+{
+       return fill_mask(base ^ (base + len - 1));
+}
+
 void set_pdx_range(unsigned long smfn, unsigned long emfn)
 {
     unsigned long idx, eidx;
index 624f04fbf156436da5b4fb45fbdd751b23d43c69..18fe8e5f38a2cfb053d91e9305090be0de423577 100644 (file)
@@ -13,6 +13,9 @@ extern unsigned long pfn_top_mask, ma_top_mask;
                          (sizeof(*frame_table) & -sizeof(*frame_table)))
 extern unsigned long pdx_group_valid[];
 
+extern u64 pdx_init_mask(u64 base_addr);
+extern u64 pdx_region_mask(u64 base, u64 len);
+
 extern void set_pdx_range(unsigned long smfn, unsigned long emfn);
 
 #define page_to_pdx(pg)  ((pg) - frame_table)